﻿/*
 * 
 * controleurs.Animateur
 * 
 * reçoit une view (extends membres.Squelette)
 * définit une animation.* (extends AnimationTimer) et la relie à la view via les MoveEvent
 * contrôle cette animation : start, reverse, stop, reset, sens, running
 * 
 * */
package bipede.controleurs
{
	import bipede.animation.*;
	import events.*;
	import flash.events.EventDispatcher;
	import flash.utils.Dictionary;
	import bipede.membres.Squelette;
	
	public class Animateur extends EventDispatcher
	{
		private var sujet:Squelette;
		public var anim:*;
		public var type:String;
		//public var liste:Dictionary = new Dictionary();
		 
		public function Animateur( s:Squelette )
		{
			sujet = s;
		}
		override public function toString():String
		{
			return "controleurs.Animateur " + type + " " + sujet.name;
		}		
		public function configure( config:Object )
		{
			if ( config.orientation == null ) config.orientation = sujet.orientation;
			anim.configure( config );
		}
		public function start(repeatCount:int=0)
		{
			//anim.repeatCount = repeatCount;
			for each ( var animation:Animateur in sujet.animateurs ) animation.stop();
			anim.start();
		}	
		public function reverse()
		{
			anim.reverse();
		}			
		public function stop()
		{
			anim.stop();
		}	
		public function reset()
		{
			anim.reset();
		}
		public function get sens():Boolean
		{
			return anim.sens;
		}	
		public function set sens(s:Boolean):void
		{
			anim.sens = s;
		}			
		public function get running():Boolean
		{
			return anim.running;
		}				
		public function action( _type:String, removeAfterPlay:Boolean = false )
		{
			//liste[ type ] = this;
			type = _type;
			sujet.register_animateur( this );
			switch( type )
			{
				case "marche" :
				
				anim = new Marche();
				//anim = anim as Marche;
				anim.sujet = sujet;
				anim.addEventListener( MoveEvent.MOVE, sujet.move );
				//anim.addEventListener( MoveEvent.REPOSE, sujet.repose );
				anim.addEventListener( MoveEvent.MOVEPIEDGAUCHE, sujet.pied_gauche.deplace );
				anim.addEventListener( MoveEvent.MOVEPIEDDROIT, sujet.pied_droit.deplace );
				anim.addEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.addEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );
				//sujet.addEventListener( MoveEvent.CHANGEPIED, anim.changepied );
				
				anim.addEventListener( MarcheEvent.FIND_SUPPORT, sujet.findSupport );
				sujet.addEventListener( MarcheEvent.LOCALISE_SUPPORT, anim.hasSupport );
				anim.addEventListener( MoveEvent.STAND, sujet.stand );
				//sujet.addEventListener( MarcheEvent.NO_SUPPORT, anim.nosupport );
				//anim.addEventListener( MarcheEvent.FIN_PAS, fin_pas );
				
				// edition_mode 
				// anim.edition_mode( sujet, true );
				
				break;
				case "leve_les_bras" :
				case "baisse_les_bras" :
				
				anim = new Gestes( type );
				anim.addEventListener( MoveEvent.MOVEMAINGAUCHE, sujet.main_gauche.deplace_extremite );
				anim.addEventListener( MoveEvent.MOVEMAINDROITE, sujet.main_droite.deplace_extremite );
				
				break;		
				case "bras_ballants" :
				
				anim = new Posture( "bras_ballants" );
				anim.addEventListener( MoveEvent.MOVE, sujet.move );
				anim.addEventListener( MoveEvent.MOVEMAINGAUCHE, sujet.main_gauche.deplace_extremite );
				anim.addEventListener( MoveEvent.MOVEMAINDROITE, sujet.main_droite.deplace_extremite );
				anim.addEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.addEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				
				break;			
				case "accroupi" :
				
				anim = new SegmentMove( "accroupi" );
				anim.addEventListener( MoveEvent.MOVE, sujet.move );
				anim.addEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.addEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				
				break;	
				case "atterrissage" :
				
				anim = new SegmentMove( "atterrissage" );
				anim.addEventListener( MoveEvent.MOVE, sujet.move );
				anim.addEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.addEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				//anim.addEventListener( MoveEvent.ENDMOVING, sujet.stand );
				
				break;					
				case "saut" :
				
				anim = new SegmentMove( "saut" );
				anim.addEventListener( MoveEvent.MOVE, sujet.move );
				anim.addEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.addEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				anim.addEventListener( MoveEvent.ENDMOVING, sujet.decolle );
				sujet.addEventListener( MoveEvent.HIT_OBSTACLE, sujet.atterrit );
				
				break;		
			}
			if ( removeAfterPlay ) anim.addEventListener( MoveEvent.ENDMOVING, remove_action );	
			anim.addEventListener( MoveEvent.ENDMOVING, end_action );	
		}
		public function end_action( e:MoveEvent )
		{
			dispatchEvent( new SequenceEvent( SequenceEvent.END ) );
		}
		public function remove_action( e:*=null )
		{
			switch( type )
			{
				case "marche" :
				
				anim.removeEventListener( MoveEvent.MOVE, sujet.move );
				anim.removeEventListener( MoveEvent.MOVEPIEDGAUCHE, sujet.pied_gauche.deplace );
				anim.removeEventListener( MoveEvent.MOVEPIEDDROIT, sujet.pied_droit.deplace );
				anim.removeEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.removeEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );				
				anim.removeEventListener( MarcheEvent.FIND_SUPPORT, sujet.findSupport );
				sujet.removeEventListener( MarcheEvent.LOCALISE_SUPPORT, anim.hasSupport );
				anim.removeEventListener( MoveEvent.STAND, sujet.stand );
				
				break;
				case "leve_les_bras" :
				case "baisse_les_bras" :
				
				anim.removeEventListener( MoveEvent.MOVEMAINGAUCHE, sujet.main_gauche.deplace_extremite );
				anim.removeEventListener( MoveEvent.MOVEMAINDROITE, sujet.main_droite.deplace_extremite );
				
				break;		
				case "bras_ballants" :
				
				anim.removeEventListener( MoveEvent.MOVE, sujet.move );
				anim.removeEventListener( MoveEvent.MOVEMAINGAUCHE, sujet.main_gauche.deplace_extremite );
				anim.removeEventListener( MoveEvent.MOVEMAINDROITE, sujet.main_droite.deplace_extremite );
				//anim.removeEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				//anim.removeEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				
				break;
				case "accroupi" :
				
				anim.removeEventListener( MoveEvent.MOVE, sujet.move );
				anim.removeEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.removeEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				
				break;	
				case "saut" :
				
				anim.removeEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.removeEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				anim.removeEventListener( MoveEvent.ENDMOVING, sujet.decolle );
				sujet.removeEventListener( MoveEvent.HIT_OBSTACLE, sujet.atterrit );
				
				break;
				case "atterrissage" :
				
				anim.removeEventListener( MoveEvent.MOVE, sujet.move );
				anim.removeEventListener( MoveEvent.POSEPIEDGAUCHE, sujet.pied_gauche.colle );
				anim.removeEventListener( MoveEvent.POSEPIEDDROIT, sujet.pied_droit.colle );					
				
				break;					
			}
			sujet.unregister_animateur( this );
		}		
	}
}